#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyleft 2011 Orcun Avsar <orc.avs@gmail.com>
#
# GNU General Public Licence (GPL)
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


import threading


locks = {}


def lock(lock_name):
  """Python decorator using global locks.
  """
  _lock = locks.get(lock_name)
  if not _lock:
    _lock = threading.Lock()
    locks[lock_name] = _lock

  def decorator(function):

    def new_function(*args, **kwargs):
      _lock.acquire()
      try:
        result = function(*args, **kwargs)
        _lock.release()
      except Exception:
        _lock.release()
        raise
      return result
    return new_function

  return decorator
